/*
 * @Description: 
 * @Author: xubin
 * @Date: 2021-11-11 13:49:02
 * @LastEditors: xubin
 * @LastEditTime: 2022-07-19 16:49:03
 */
import __DB__       from '../db/index.js';
import __tool__     from '../tool/index.js';
import __canvas__   from '../canvas/index.js';

class customEventClass{
    constructor(){
        this.myEvent = {
            scaleChange                 : null,// 缩放完成
            undoRedoOpt                 : null,// 撤消重做需要的事件回调
            nodeAdd                     : null,// 新增节点
            nodeDel                     : null,// 删除节点
            nodeUpdata                  : null,// 更新节点
            nodeClick                   : null,// 单击节点
            nodeDblclick                : null,// 双击节点
            nodeDrag                    : null,// 拖动节点
            nodeDragAdd                 : null,// 拖动后新增节点
            nodeCheckbox                : null,// 节点多选
            cntMenuNode                 : null,// 右键节点
            cntMenuCanvas               : null,// 右键
            contactLineEvt              : null,// 关联线连接
            contactLineEvtCntMenu       : null,// 关联线连接(右键使用)
            pull                        : null,// 展开和收起
            keydown                     : null,// 键盘按下
            x_keyup                     : null,// 键盘弹起
            nodeMouseOver               : null,// 鼠板经过节点
            nodeMouseOut                : null,// 鼠板离开节点
            canvasDrag                  : null,// 画布拖动
            
            
            
            
            
        };
    
        // 操作字典数据
        this.opt = {
            line                        : false,
            scaleChange                 : null,// 缩放完成
            nodeAdd                     : null,// 新增节点
            nodeDel                     : null,// 删除节点
            nodeUpdata                  : null,// 更新节点
            nodeClick                   : null,// 单击节点
            nodeDblclick                : null,// 双击节点
            nodeDrag                    : null,// 拖动节点
            nodeDragAdd                 : null,// 拖动后新增节点
            nodeCheckbox                : null,// 节点多选
            cntMenuNode                 : null,// 右键节点
            cntMenuCanvas               : null,// 右键
            contactLineEvt              : null,// 关联线连接
            contactLineEvtCntMenu       : null,// 关联线连接(右键使用)
            pull                        : null,// 展开和收起
            keydown                     : null,// 键盘按下
            x_keyup                     : null,// 键盘弹起
            nodeMouseOver               : null,// 鼠板经过节点
            nodeMouseOut                : null,// 鼠板离开节点
            canvasDrag                  : null,// 画布拖动
        };

        this.callbackFn = {};

        this.us_to_zh = {
            scaleChange                 : '缩放完成',
            undoRedoOpt                 : '撤消重做需要的事件回调', 
            nodeAdd                     : '新增节点',                   // 新增节点
            nodeDel                     : '删除节点',                   // 删除节点
            nodeUpdata                  : '更新节点',                   // 更新节点
            nodeClick                   : '单击节点',                   // 单击节点
            nodeDblclick                : '双击节点',                   // 双击节点
            nodeDrag                    : '拖动节点',                   // 拖动节点
            nodeDragAdd                 : '拖动后新增节点',              // 拖动后新增节点
            nodeCheckbox                : '节点多选',                   // 节点多选
            cntMenuNode                 : '右键节点',                   // 右键节点
            cntMenuCanvas               : '右键',                       // 右键
            contactLineEvt              : '关联线连接',                 // 关联线连接
            contactLineEvtCntMenu       : '关联线连接(右键使用)',        // 关联线连接(右键使用)
            pull                        : '展开和收起',                 // 展开和收起
            keydown                     : '键盘按下',
            x_keyup                     : '键盘弹起',
            nodeMouseOver               : '鼠板经过节点',
            nodeMouseOut                : '鼠板离开节点',
            canvasDrag                  : '画布拖动',
        };
    }

    /*
        // 绑定自定义事件
        __customEvent__.set({
            type:"",
            data:{}
        });
    */
    set(res){
        let type = res.type,
            data = res.data||{};

        this.opt[type] = data;
        window.dispatchEvent(this.myEvent[type]);

        // 撤消重做需要的事件回调
        let undoRedoLists = ['nodeAdd','nodeDel','nodeUpdata','nodeDrag'];
        if(undoRedoLists.includes(type)){
            this.set({
                type:"undoRedoOpt"
            })
        }
    }

    // 事件注册
    register(){
        this.myEvent.scaleChange                = new Event('scaleChange');             // 缩放完成
        this.myEvent.undoRedoOpt                = new Event('undoRedoOpt');             // 撤消重做需要的事件回调
        this.myEvent.nodeAdd                    = new Event('nodeAdd');                 // 新增节点
        this.myEvent.nodeDel                    = new Event('nodeDel');                 // 删除节点
        this.myEvent.nodeUpdata                 = new Event('nodeUpdata');              // 更新节点
        this.myEvent.nodeClick                  = new Event('nodeClick');               // 单击节点
        this.myEvent.nodeDblclick               = new Event('nodeDblclick');            // 双击节点
        this.myEvent.nodeDrag                   = new Event('nodeDrag');                // 拖动节点
        this.myEvent.nodeDragAdd                = new Event('nodeDragAdd');             // 拖动后新增节点
        this.myEvent.nodeCheckbox               = new Event('nodeCheckbox');            // 节点多选
        this.myEvent.cntMenuNode                = new Event('cntMenuNode');             // 右健节点
        this.myEvent.cntMenuCanvas              = new Event('cntMenuCanvas');           // 右健画布
        this.myEvent.contactLineEvt             = new Event('contactLineEvt');          // 关联线连接
        this.myEvent.contactLineEvtCntMenu      = new Event('contactLineEvtCntMenu');   // 关联线连接(右键使用)
        this.myEvent.pull                       = new Event('pull');                    // 展开和收起
        this.myEvent.keydown                    = new Event('keydown');                 // 键盘按下
        this.myEvent.x_keyup                    = new Event('x_keyup');                 // 键盘弹起
        this.myEvent.nodeMouseOver              = new Event('nodeMouseOver');           // 鼠板经过节点
        this.myEvent.nodeMouseOut               = new Event('nodeMouseOut');            // 鼠板离开节点
        this.myEvent.canvasDrag                 = new Event('canvasDrag');              // 画布拖动
    }

    on(eventName,fn){
        if(!fn)return;
        this.callbackFn[eventName] = (event)=>{
            fn(event,{
                msg :this.us_to_zh[eventName],
                data:this.opt[eventName]
            })
        };  
        window.addEventListener(eventName,this.callbackFn[eventName]);
    }

    off(eventName='all'){
        if(eventName === 'all'){
            for(let k in this.callbackFn){
                window.removeEventListener(k, this.callbackFn[k]);
            }
        }else if(this.callbackFn[eventName]){
            window.removeEventListener(eventName, this.callbackFn[eventName]);
        }
    }
}

let customEvent = new customEventClass();
export default customEvent;